<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title> 模块系统</title>
  <style>
    div, li, p {
      line-height: 40px;
    }
    span {
      color: red;
    }
  </style>
</head>
<body>
  <h2>模块系统</h2>
  <ul>
    <li>node 出现以前，javascript 的最大的缺点就是缺乏 <span>模块</span></li>
    <li>nodeJS 的模块系统由 commonJS 实现</li>
    <li>webpack模块系统支持es6的模块语法</li>
    <li>node.js支持es6语法，但是不支持es6的import模块系统</li>
    <li>
      commonJS 对模块定义十分简单，主要为模块引用，模块定义，模块表示是3个部分
    </li>
    <li>
      模块引用用 require(),导出用 exports,<span>exports 是唯一导出的出口，如果要导出一个对象，请使用 export</span>
    </li>
    <li>
      在 node 中，一个文件就是一个模块。
    </li>
    <li>
      模块标识，其实就是传递给 require 方法的参数。它必须符合小驼峰命名的字符串。或者以...开头的路径，或者是绝对路径。它可以没有文件的后缀名
    </li>
    <li>
      CommonJS 构建的这套模块导出机制使得用户完全不用考虑变量的污染。命名空间等方案与之相比相形见绌
    </li>
    <li>
      在 nodeJS 中引入模块，需要经过路径分析，文件定位，编译执行是3个步骤
    </li>
    <li>
      在 node 中，模块分为两类，一类是 Node 提供的模块，称为核心模块，另一类是开发者自己编写的，称为文件模块
    </li>
    <li>
      核心模块在编译过程中，编译进了二进制执行文件。在 node 启动时，部分核心模块就被直接加载到了内存中。所以核心模块引入时，编译执行者两个步骤可以省略掉。所以加载速度是最快的
    </li>
    <li>
      文件模块则是在运行时加载。需要完整的路径分析，文件定位，编译执行过程。速度比核心模块慢
    </li>
    <li>
      与前端浏览器会缓存静态脚本文件以提高性能一样，Node 对引入过的模块都会进行缓存。以减少二次引入时的开销。不同的是，浏览器仅仅缓存文件，而 Node 缓存的是编译和执行之后的对象。不论是核心模块还是文件模块，require()方法对相同模块的二次加载都一律采用缓存优先的策略。不同之处在于核心模块的缓存检查先于文件模块的缓存检查。
    </li>
  </ul>
</body>
</html>